package cn.vehicle.domains.vo;

import cn.vehicle.enums.StatusCode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Result 是一个通用的响应结果封装类，用于标准化接口返回数据。
 * 泛型 T 表示响应数据的类型，可以是任意类型的数据。
 *
 * @param <T> 响应数据类型
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {

    private String code;

    private String message;

    private T data;

    /**
     * 使用状态码枚举构造响应结果对象。
     * 该构造函数用于快速创建包含状态码和消息的结果实例。
     *
     * @param statusCode 状态码枚举对象，包含响应码和消息
     */
    public Result(StatusCode statusCode) {
        // 设置响应码和消息
        this.code = statusCode.getCode();
        this.message = statusCode.getMessage();
    }

    /**
     * 返回一个表示操作成功且无数据的结果对象。
     *
     * @return 成功的结果实例，data 为 null
     */
    public static Result<Void> success() {
        // 使用预定义的成功状态码创建结果
        return new Result<>(StatusCode.SUCCESS);
    }

    /**
     * 返回一个表示操作成功且包含数据的结果对象。
     *
     * @param data 成功时返回的数据
     * @param <T>  数据类型
     * @return 包含数据的成功结果实例
     */
    public static <T> Result<T> success(T data) {
        // 创建成功结果并设置数据
        Result<T> result = new Result<>(StatusCode.SUCCESS);
        result.setData(data);
        return result;
    }

    /**
     * 返回一个表示操作失败的结果对象。
     *
     * @param code    错误码
     * @param message 错误消息
     * @return 包含错误码和错误消息的结果实例
     */
    public static Result<Void> error(String code, String message) {
        // 创建空结果并设置错误码和消息
        Result<Void> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

}
